package laborum2011.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import laborum2011.excepcion.DAOExcepcion;
import laborum2011.modelo.PostulanteXOferta;
import laborum2011.util.ConexionBD;
  
public class PostulanteXOfertaDAO extends BaseDAO {

	public Collection<PostulanteXOferta> buscarPorOferta(int id_oferta) throws DAOExcepcion {
		System.out.println("PostulanteXOfertaDAO: buscarPorOferta(int id_oferta)");
		String query = "SELECT id_postulanteXoferta, id_postulante, id_oferta, fec_postulacion, estado" 
			          +"FROM postulantexoferta WHERE estado = 1 and id_oferta like ?";
		Collection<PostulanteXOferta> lista = new ArrayList<PostulanteXOferta>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + id_oferta + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				PostulanteXOferta vo = new PostulanteXOferta();
				vo.setId_postulanteXoferta(rs.getInt("id_postulanteXoferta"));
				vo.setId_postulante(rs.getInt("id_postulante"));
				vo.setId_oferta(rs.getInt("id_oferta"));
				vo.setFec_postulacion(rs.getTimestamp("fec_postulacion"));
				vo.setEstado(rs.getInt("estado"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public void insertar(PostulanteXOferta po) throws DAOExcepcion {

		System.out.println("PostulanteXOfertaDAO: insertar(PostulanteXOferta po)");
		String query = "INSERT INTO postulantexoferta(id_postulante, id_oferta, fec_postulacion, estado) VALUES (?, ?, ?, ?)";
		Connection con = null;
		PreparedStatement stmt = null;

		System.out.println(query);
		try {
			con = ConexionBD.obtenerConexion();
			
			stmt = con.prepareStatement(query);
			stmt.setInt(1, po.getId_postulante());
			stmt.setInt(2, po.getId_oferta());
			stmt.setTimestamp(3, po.getFec_postulacion());
			stmt.setInt(4, po.getEstado());

			int i = stmt.executeUpdate();

			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}	
	

	public void eliminar(int id_postulanteXoferta) throws DAOExcepcion {
		System.out.println("PostulanteXOfertaDAO: eliminar(int id_postulanteXoferta)");
		String query = "update postulantexoferta set estado = 0 where id_postulanteXoferta = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_postulanteXoferta);

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(PostulanteXOferta vo) throws DAOExcepcion {
		System.out.println("PostulanteXOfertaDAO: actualizar(PostulanteXOferta vo)");
		String query = "update postulantexoferta set id_postulante = ?, id_oferta = ?, fec_postulacio = ? WHERE estado = 1 and id_postulanteXoferta = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setInt(5, vo.getId_postulanteXoferta());
			stmt.setInt(1, vo.getId_oferta());
			stmt.setInt(2, vo.getId_postulante());
			stmt.setTimestamp(3, vo.getFec_postulacion());
			stmt.setInt(4, vo.getEstado());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public PostulanteXOferta obtenerPostulacion(int id_postulanteXoferta) throws DAOExcepcion {
		System.out.println("PostulanteXOfertaDAO: obtener(int id_postulanteXoferta)");
		PostulanteXOferta vo = new PostulanteXOferta();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_postulanteXoferta FROM postulantexoferta WHERE estado = 1 and id_postulanteXoferta = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_postulanteXoferta);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setId_postulanteXoferta(rs.getInt("id_postulanteXoferta"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public PostulanteXOferta obtenerPostulacionXfecha(int id_postulante, int id_oferta, Date fec_postulacion) throws DAOExcepcion {
		System.out.println("PostulanteXOfertaDAO: obtener(int id_postulante, int id_oferta, Date fec_postulacion)");
		PostulanteXOferta vo = new PostulanteXOferta();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_postulanteXoferta, id_postulante, id_oferta, fec_postulacion, estado FROM postulantexoferta WHERE estado = 1 and id_postulante = ? and id_oferta = ? and fec_postulacion = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_postulante);
			stmt.setInt(2, id_oferta);
			stmt.setDate(3, fec_postulacion);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setId_postulante(rs.getInt("id_postulante"));
				vo.setId_postulante(rs.getInt("id_oferta"));
				vo.setFec_postulacion(rs.getTimestamp("fec_postulacion"));
				vo.setEstado(rs.getInt("estado"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Collection<PostulanteXOferta> listar() throws DAOExcepcion {
		System.out.println("EmpresaDAO: listar()");
		Collection<PostulanteXOferta> c = new ArrayList<PostulanteXOferta>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT id_postulanteXoferta, id_postulante, id_oferta, fec_postulacion, estado" 
			          		+"FROM postulantexoferta Where estado = 1";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				PostulanteXOferta vo = new PostulanteXOferta();			

				vo.setId_postulanteXoferta(rs.getInt("id_postulanteXoferta"));
				vo.setId_postulante(rs.getInt("id_postulante"));
				vo.setId_oferta(rs.getInt("id_oferta"));
				vo.setFec_postulacion(rs.getTimestamp("fec_postulacion"));
				vo.setEstado(rs.getInt("estado"));				
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
}
